/*
 * Copyright 2012-2020 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.boot.web.embedded.undertow;

import java.io.File;
import java.util.Collection;

import io.undertow.Undertow.Builder;

import org.springframework.boot.web.server.ConfigurableWebServerFactory;

/**
 * 用于 Undertow 特性配置的 {@link ConfigurableWebServerFactory}。
 *
 * @author Brian Clozel
 * @since 2.0.0
 * @see UndertowServletWebServerFactory
 * @see UndertowReactiveWebServerFactory
 */
public interface ConfigurableUndertowWebServerFactory extends ConfigurableWebServerFactory {

	/**
	 * 设置应用于 Undertow {@link Builder} 的 {@link UndertowBuilderCustomizer}。
	 * 调用此方法将替换已存在的所有定制器。
	 * @param customizers 要设置的定制器集合
	 * @since 2.3.0
	 */
	void setBuilderCustomizers(Collection<? extends UndertowBuilderCustomizer> customizers);

	/**
	 * 添加用于定制 Undertow {@link Builder} 的 {@link UndertowBuilderCustomizer}。
	 * @param customizers 要添加的定制器
	 */
	void addBuilderCustomizers(UndertowBuilderCustomizer... customizers);

	/**
	 * 设置缓冲区大小。
	 * @param bufferSize 缓冲区大小
	 */
	void setBufferSize(Integer bufferSize);

	/**
	 * 设置 IO 线程数。
	 * @param ioThreads IO 线程数
	 */
	void setIoThreads(Integer ioThreads);

	/**
	 * 设置工作线程数。
	 * @param workerThreads 工作线程数
	 */
	void setWorkerThreads(Integer workerThreads);

	/**
	 * 设置是否使用直接内存缓冲区。
	 * @param useDirectBuffers 是否使用直接缓冲区
	 */
	void setUseDirectBuffers(Boolean useDirectBuffers);

	/**
	 * 设置访问日志目录。
	 * @param accessLogDirectory 访问日志目录
	 */
	void setAccessLogDirectory(File accessLogDirectory);

	/**
	 * 设置访问日志格式。
	 * @param accessLogPattern 日志格式
	 */
	void setAccessLogPattern(String accessLogPattern);

	/**
	 * 设置访问日志文件名前缀。
	 * @param accessLogPrefix 文件名前缀
	 */
	void setAccessLogPrefix(String accessLogPrefix);

	/**
	 * 设置访问日志文件名后缀。
	 * @param accessLogSuffix 文件名后缀
	 */
	void setAccessLogSuffix(String accessLogSuffix);

	/**
	 * 设置是否启用访问日志。
	 * @param accessLogEnabled 是否启用
	 */
	void setAccessLogEnabled(boolean accessLogEnabled);

	/**
	 * 设置是否启用访问日志轮转。
	 * @param accessLogRotate 是否轮转
	 */
	void setAccessLogRotate(boolean accessLogRotate);

	/**
	 * 设置是否启用 x-forward-* 头部处理。
	 * @param useForwardHeaders 是否启用 x-forward 头部支持
	 */
	void setUseForwardHeaders(boolean useForwardHeaders);

}
